home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 8174 / 8174.xpi / chrome / antbar.jar / content / player / player.js < prev    next >
Text File  |  2009-12-30  |  16KB  |  526 lines

  1. // 
  2. //  player.js
  3. //  firefox
  4. //  
  5. //  Created by Zak on 2008-06-18.
  6. //  Contributor Brian King (http://briks.si)
  7. //  Copyright 2008-2009 Ant.com. All rights reserved.
  8. // 
  9.  
  10. /**
  11.  * AntPlayer: Handle all actions inside the player.xul window
  12.  */
  13. var AntPlayer =
  14. {
  15.     movieFileMatch: /^([\w-]*)\.?(.*)\.(?:flv|3gpp|mp4|asf|aac)$/i,
  16.     doc: null,
  17.     listBox: null,
  18.     currentVideo: '',
  19.     flashVars: '&javascriptid=antFlvPlayerSwf&enablejs=true&backcolor=0xFFFFFF&autoscroll=true&searchbar=false&debug=true',
  20.     cleanedSearchBox: false,
  21.  
  22.  
  23.     /**
  24.      * Initialize the list
  25.      * @param doc           The document window
  26.      */
  27.     init: function (doc)
  28.     {
  29.         var self = AntPlayer;
  30.         var playOnLoad = false;
  31.  
  32.         self.doc = doc;
  33.         self.listBox = AntLib.ob('antFlvPlayerRichListBox', doc);
  34.         self.antSplash();
  35.         self.fillVideos();
  36.  
  37.         window.addEventListener("load", self.autoPlay(playOnLoad), false);
  38.  
  39.         //unload because the movie keep running when leaving the player with a bookmark link
  40.         window.addEventListener("unload", function (){ self.antSplash(); }, false);
  41.         window.addEventListener("resize", function (){ self.playVideo(self.currentVideo, true); }, false);
  42.     },
  43.  
  44.     extractFlvOrigin: function (filename)
  45.     {
  46.         return filename.replace(/\..*/, "");
  47.     },
  48.  
  49.     extractFlvName: function (filename)
  50.     {
  51.         return filename.replace(/\.[^.]{2,4}$/i, "").replace(/^\w+\./i, "");
  52.     },
  53.  
  54.     fileExist: function (path)
  55.     {
  56.         var file = AntLib.CCIN("@mozilla.org/file/local;1", "nsILocalFile");
  57.         file.initWithPath(path);
  58.         return file.exists();
  59.     },
  60.     
  61.     /**
  62.      * Auto play a video when the player loads using preference or trying to guess the last download
  63.      */
  64.     autoPlay: function (playOnLoad)
  65.     {
  66.         var self = AntPlayer;
  67.  
  68.         return function ()
  69.         {
  70.             var splitter = AntLib.ob("antFlvPlayerSplitter");
  71.             var embed = AntLib.ob("antFlvPlayerEmbed");
  72.             var file = AntLib.CCIN("@mozilla.org/file/local;1", "nsILocalFile");
  73.  
  74.             splitter.addEventListener("mouseup", function (){ self.playVideo(self.currentVideo, true); }, true);
  75.             
  76.             var flvToPlay = false;
  77.             if (AntPrefs.flvToPlay) {
  78.                 file.initWithPath(AntPrefs.flvToPlay);
  79.                 flvToPlay = true;
  80.             }
  81.  
  82.             if (!flvToPlay || !file.exists())
  83.             {
  84.                 var index = self.listBox.getIndexOfFirstVisibleRow();
  85.                 if (isNaN(index) || index < 0 || index >= self.listBox.childNodes.length)
  86.                     return;
  87.  
  88.                 var nodes = self.listBox.childNodes[index].childNodes;
  89.                 self.playVideo(nodes[1].getAttribute('label'), playOnLoad);
  90.             }
  91.             else
  92.             {
  93.                 self.playVideo(AntPrefs.flvToPlay, playOnLoad);
  94.             }
  95.  
  96.         }
  97.     },
  98.  
  99.     /**
  100.      * getItemByUrl
  101.      */
  102.     colorItemByUrl: function (url)
  103.     {
  104.         var self = AntPlayer;
  105.  
  106.         for (var i = 0; i < self.listBox.childNodes.length; i++)
  107.         {
  108.             var item = self.listBox.childNodes[i];
  109.             var className = "antFlvPlayerRichListItem";
  110.  
  111.             if (!item)
  112.                 return;
  113.             if (url == item.path)
  114.             {
  115.                 className = item.getAttribute('class') + " antFlvPlayerRichListItemActive";
  116.                 item.setAttribute('class', className); 
  117.             }
  118.             else
  119.             {
  120.                 if ((i % 2) == 0)
  121.                     className += " antFlvPlayerRichListItemGrey";
  122.                 item.setAttribute('class', className);
  123.             }
  124.         }
  125.         return null;
  126.     },
  127.  
  128.     
  129.     /**
  130.      * Handle search using terms typed in the antToolBarSearchBox
  131.      * @param event         The event that triggered the call to self callback
  132.      * @param type          The type of search (web,image,video,news,blog)
  133.      */
  134.     doSearch: function (type)
  135.     {
  136.         var self = AntPlayer;
  137.         var searchTermsBox = AntLib.ob("antFlvPlayerSearchBox");
  138.         var searchTerms = AntLib.trim(searchTermsBox.value);
  139.  
  140.         if (searchTerms.length == 0)
  141.         {
  142.             AntLib.openURL('http://www.ant.com/');
  143.         }
  144.         else
  145.         {
  146.             searchTerms = AntLib.uriEncode(searchTerms);
  147.             AntLib.openURL('http://www.ant.com/'+type+'/'+searchTerms);
  148.         }
  149.     },
  150.     
  151.     /**
  152.      * Clear the searchbox the first time user enter it
  153.      * @param isFocus true if the callback is onFocus otherwise false
  154.      */
  155.     onSearchBoxOnFocus: function (isFocus)
  156.     {
  157.         var self = AntPlayer;
  158.         var searchBox = AntLib.ob('antFlvPlayerSearchBox');
  159.         
  160.         if (!self.cleanedSearchBox && isFocus)
  161.         {
  162.             searchBox.value = '';
  163.             self.cleanedSearchBox = true;
  164.         }
  165.         
  166.         if (!isFocus && !searchBox.value)
  167.         {
  168.             searchBox.value = AntLang.getString('AntBar.SearchWithAnt');
  169.             self.cleanedSearchBox = false;
  170.         }
  171.     },
  172.  
  173.     /**
  174.      * Handle keystrokes entered in the searchBox
  175.      * @param event         The event that triggered the call to self function
  176.      */
  177.     onSearchBoxKeyPress: function (event)
  178.     {
  179.         var self = AntPlayer;
  180.         if (event.keyCode == event.DOM_VK_RETURN && AntLib.ob('antFlvPlayerSearchBox').value != '')
  181.             self.doSearch('web');
  182.     },
  183.  
  184.     /**
  185.      * Display the Splash Screen
  186.      */
  187.     antSplash: function ()
  188.     {
  189.         var self = AntPlayer;
  190.         var embed = AntLib.ob("antFlvPlayerEmbed");
  191.         var e = AntLib.uriEncode;
  192.  
  193.         embed.setAttribute("flashvars", "file=" + e("chrome://antbar/content/player/skin/img/ant.jpg") + "&image=chrome://antbar/content/player/skin/img/ant.jpg&shownavigation=false&javascriptid=antFlvPlayerSwf&enablejs=true&frontcolor=0xFFFFFF&lightcolor=0xFFFFFF&screencolor=0xFFFFFF&searchbar=false&showicons=false&shownavigation=false");
  194.         AntLib.ob("antFlvPlayerContentBox").removeChild(AntLib.ob("antFlvPlayerContentBox").firstChild);
  195.         AntLib.ob("antFlvPlayerContentBox").insertBefore(embed, AntLib.ob("antFlvPlayerSplitter"));
  196.         self.fillTitlebar("Ant.com", "Player");
  197.     },
  198.  
  199.     fillTitlebar: function (aOrigin, aName)
  200.     {
  201.         var self = AntPlayer;
  202.         // Fix to remove innerHTML insertion by Wladimir Palant, integrated by Brian King (http://briks.si)
  203.         var str = AntLang.getFormatString("AntPlayer.TitleBar", aOrigin, aName);
  204.         var element = AntLib.ob("antFlvPlayerTitleBar");
  205.         if (/(.*?)<html:strong>(.*?)<\/html:strong>(.*)/.test(str))
  206.         {
  207.             var strong = document.createElementNS("http://www.w3.org/1999/xhtml", "strong");
  208.             strong.textContent = RegExp.$2;
  209.  
  210.             element.textContent = ""; // reset
  211.             element.appendChild(document.createTextNode(RegExp.$1));
  212.             element.appendChild(strong);
  213.             element.appendChild(document.createTextNode(RegExp.$3));
  214.         }
  215.         else
  216.             element.textContent = str;
  217.         // end fix
  218.     },
  219.  
  220.     formatDisplayStrings: function (flvlink)
  221.     {
  222.         var self = AntPlayer;
  223.         var humanizedName = flvlink.name.replace(/_/g, ' ');
  224.         var infosString = flvlink.origin;
  225.  
  226.         infosString = AntLib.upFirstLetter(infosString);
  227.         humanizedName = AntLib.upFirstLetter(humanizedName);
  228.         if (flvlink.filesize)
  229.             infosString += " - " + flvlink.filesize;
  230.         if (flvlink.date)
  231.         {
  232.             var date = new Date(flvlink.date);
  233.             var day = date.getDate();
  234.             var month = date.getMonth();
  235.             var year = date.getFullYear();
  236.             var hour = date.getHours();
  237.             var minute = date.getMinutes();
  238.             var formatedHour = day+"/"+month+"/"+year+" "+hour+":"+minute;
  239.  
  240.             infosString += " - " + formatedHour;
  241.         }
  242.  
  243.         return [humanizedName, infosString];
  244.     },
  245.  
  246.     /**
  247.      * Add a ListItem to the ListBox
  248.      * @param origin        Origin of the flv
  249.      * @param url           Url of the flv
  250.      * @param name          Guessed name of the flv
  251.      * @param id            A unique ID for the listItem
  252.      */
  253.     appendItem: function (flvlink, id)
  254.     {
  255.         var self = AntPlayer;
  256.         var className = "antFlvPlayerRichListItem";
  257.         var richListItem = self.doc.createElement('richlistitem');
  258.         var nameLabel = self.doc.createElement('label');
  259.         var originLabel = self.doc.createElement('label');
  260.         var strings = self.formatDisplayStrings(flvlink);
  261.  
  262.         if ((id % 2) == 0)
  263.             className += " antFlvPlayerRichListItemGrey";
  264.         richListItem.setAttribute('class', className);
  265.         richListItem.setAttribute('ondblclick', 'AntPlayer.onListItemDblClick(event);');
  266.         richListItem.setAttribute('context', "antFlvPlayerPopupMenu");
  267.         richListItem.setAttribute('orient', "vertical");
  268.         richListItem.path = flvlink.url;
  269.  
  270.         nameLabel.setAttribute('value', strings[0]);
  271.         nameLabel.setAttribute('class', 'antFlvPlayerRichListName');
  272.         nameLabel.setAttribute('crop', 'end');
  273.  
  274.         originLabel.setAttribute('value', strings[1]);
  275.         originLabel.setAttribute('class', 'antFlvPlayerRichListInfos');
  276.         originLabel.setAttribute('crop', 'end');
  277.  
  278.         richListItem.appendChild(nameLabel);
  279.         richListItem.appendChild(originLabel);
  280.  
  281.         self.listBox.appendChild(richListItem);
  282.     },
  283.     
  284.     
  285.     /**
  286.      * Redraw the iframe with needed parameters to play the specified file
  287.      * @param path      The full file path to play (Format: /tmp/origin.name.flv)
  288.      */
  289.     playVideo: function (path, start)
  290.     {
  291.         if (path == "") return;
  292.         if (typeof(start) == 'undefined') start = true;
  293.  
  294.         var self = AntPlayer;
  295.         var embed = AntLib.ob("antFlvPlayerEmbed");
  296.         var e = AntLib.uriEncode;
  297.  
  298.         var file_path = e('file://' + path);
  299.         var query = "&file=" + file_path + self.flashVars + "&autostart=" + (start ? "true" : "false");
  300.  
  301.         AntLib.toLog("Playing: " + file_path);
  302.  
  303.         embed.setAttribute("flashvars", query);
  304.         AntLib.ob("antFlvPlayerContentBox").removeChild(AntLib.ob("antFlvPlayerContentBox").firstChild);
  305.         AntLib.ob("antFlvPlayerContentBox").insertBefore(embed, AntLib.ob("antFlvPlayerSplitter"));
  306.  
  307.         try
  308.         {
  309.             var file = AntLib.CCIN("@mozilla.org/file/local;1", "nsILocalFile");
  310.             file.initWithPath(path);
  311.  
  312.             var origin = self.extractFlvOrigin(file.leafName);
  313.             var name = self.extractFlvName(file.leafName);
  314.  
  315.             name = name.replace(/_/g, " ");
  316.  
  317.             self.fillTitlebar(origin, name);
  318.         }
  319.         catch (e)
  320.         {}
  321.  
  322.         self.currentVideo = path;
  323.         self.colorItemByUrl(path);
  324.     },
  325.  
  326.     /**
  327.      * Oncommand Logo Click
  328.      */
  329.     onLogoClick: function ()
  330.     {
  331.         AntLib.openURL('http://www.ant.com/');
  332.     },
  333.  
  334.     /**
  335.      * Callback: fired when the user double click an item in the list
  336.      * @param event     The event that triggered the call to this method
  337.      */
  338.     onListItemDblClick: function (event)
  339.     {
  340.         var self = AntPlayer;
  341.         var node = event.target;
  342.         
  343.         while (node.nodeName != "richlistitem")
  344.             node = node.parentNode;
  345.         self.playVideo(node.path);
  346.     },
  347.  
  348.     /**
  349.      * Callback: fired when the user click on "Play" in the context menu
  350.      */
  351.     onPopupPlay: function ()
  352.     {
  353.         var self = AntPlayer;
  354.         var node = document.popupNode;
  355.         
  356.         while (node.nodeName != "richlistitem")
  357.             node = node.parentNode;
  358.         self.playVideo(node.path);
  359.     },
  360.  
  361.     /**
  362.      * Callback: fired when the user click on "Rename" in the context menu
  363.      */
  364.     onPopupRename: function ()
  365.     {
  366.         var self = AntPlayer;
  367.         var node = document.popupNode;
  368.  
  369.         while (node.nodeName != "richlistitem")
  370.             node = node.parentNode;
  371.         var path = node.path;
  372.         var file = AntLib.CCIN("@mozilla.org/file/local;1", "nsILocalFile");
  373.  
  374.         file.initWithPath(path);
  375.  
  376.         var origin = self.extractFlvOrigin(file.leafName);
  377.         var name = self.extractFlvName(file.leafName);
  378.         if (self.isCurrentlyPlaying(file.path))
  379.             return ;
  380.  
  381.         name = name.replace(/_/g,' ');
  382.         var newName = prompt(AntLang.getFormatString("AntPlayer.PromptRename", name), name);
  383.  
  384.         if (!newName)
  385.             return ;
  386.  
  387.         if (!newName.match(/^[\w -]+$/i))
  388.         {
  389.             alert(AntLang.getString("AntPlayer.InvalidFileName"));
  390.             return
  391.         }
  392.         newName = AntLib.sanitize(newName);
  393.         if (file.exists())
  394.         {
  395.             try
  396.             {
  397.                 file.moveTo(file.parent, origin + "." + newName + ".flv");
  398.             }
  399.             catch (e)
  400.             {
  401.                 alert(AntLang.getString("AntPlayer.ErrorRenaming"));
  402.                 return ;
  403.             }
  404.         }
  405.         self.fillVideos();
  406.     },
  407.  
  408.  
  409.     /**
  410.      * Check if the given video path is currently playing
  411.      * @param path          The path to check
  412.      */
  413.     isCurrentlyPlaying: function (path)
  414.     {
  415.         if (self.currentVideo == path)
  416.         {
  417.             alert(AntLang.getString("AntPlayer.ErrorCurrentlyPlaying"));
  418.             return true;
  419.         }
  420.  
  421.         return false;
  422.     },
  423.  
  424.     /**
  425.      * Callback: fired when the user click on "Delete" in the context menu
  426.      */
  427.     onPopupDelete: function ()
  428.     {
  429.         var self = AntPlayer;
  430.         var node = document.popupNode;
  431.  
  432.         while (node.nodeName != "richlistitem")
  433.             node = node.parentNode;
  434.         var path = node.path;
  435.         var file = AntLib.CCIN("@mozilla.org/file/local;1", "nsILocalFile");
  436.         var name;
  437.  
  438.         file.initWithPath(path);
  439.         name = self.extractFlvName(file.leafName);
  440.  
  441.         if (confirm(AntLang.getFormatString("AntPlayer.ConfirmDelete", name)))
  442.         {
  443.             if (self.currentVideo == path)
  444.                 self.antSplash();
  445.             try  {
  446.                 file.remove(false);
  447.             }
  448.             catch (e) {
  449.                 alert(AntLang.getString("AntPlayer.ErrorDeleting"));
  450.                 AntLib.toLog("ERROR: AntPlayer.onPopupDelete: " + e);
  451.                 return ;
  452.             }
  453.             self.fillVideos();
  454.         }
  455.     },
  456.  
  457.     /**
  458.      * Remove all listItems from the ListBox
  459.      */
  460.     removeAll: function ()
  461.     {
  462.         var self = AntPlayer;
  463.  
  464.         while (self.listBox.lastChild)
  465.             self.listBox.removeChild(self.listBox.lastChild);
  466.     },
  467.  
  468.     /**
  469.      * Fetch videos from a directory and return an Array of AntFlvLink
  470.      */
  471.     fetchVideos: function ()
  472.     {
  473.         var self = AntPlayer;
  474.         var pref = AntPrefs.getAntBranch();
  475.         if (!pref)
  476.         {
  477.             alert(AntLang.getString("AntDownloadManager.InvalidDestinationFolder"));
  478.             return null;
  479.         }
  480.         var dir = pref.getCharPref("flvdir");
  481.         var videoDirectory = AntLib.CCIN("@mozilla.org/file/local;1", "nsILocalFile");
  482.         var entries;
  483.         var arr = new AntArray();
  484.  
  485.         videoDirectory.initWithPath(dir);
  486.         if (!videoDirectory.isDirectory())
  487.             return new AntArray();
  488.  
  489.         entries = videoDirectory.directoryEntries;
  490.         while (entries.hasMoreElements())
  491.         {
  492.             var entry = entries.getNext();
  493.             var m;
  494.  
  495.             AntLib.QI(entry, AntLib.CI("nsIFile"));
  496.             if (m = entry.leafName.match(self.movieFileMatch))
  497.             {
  498.                 var origin = m[1];
  499.                 var name = m[2];
  500.  
  501.                 var url = entry.path;
  502.                 var lastModifiedTime = entry.lastModifiedTime;
  503.                 var filesize = AntLib.convertByteUnits(entry.fileSize);
  504.  
  505.                 arr.push(new AntFlvLink({origin: origin, url:url, name:name, date:lastModifiedTime, filesize:filesize[0] + " " + filesize[1]}));
  506.             }
  507.         }
  508.         
  509.         return arr;
  510.     },
  511.  
  512.     /**
  513.      * Fill the list with the videos
  514.      */
  515.     fillVideos: function ()
  516.     {
  517.         var self = AntPlayer;
  518.         if (self.listBox.childNodes.length > 0)
  519.             self.removeAll();
  520.         var listVideos = self.fetchVideos();
  521.  
  522.         for (var i = 0; i < listVideos.length; i++)
  523.             self.appendItem(listVideos[i], i);
  524.     },
  525. }
  526.